package com.niit.zerotestpdfreader;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.pdf.PdfRenderer;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.ParcelFileDescriptor;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.Toast;

import com.niit.zerotestpdfreader.service.RecentService;

import org.jetbrains.annotations.NotNull;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;

public class PdfPage extends AppCompatActivity {

    private String[] permissions = {Manifest.permission.READ_EXTERNAL_STORAGE};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_paf_page);

        Intent intent = getIntent();
        String path = intent.getStringExtra("path");

        insetPathToDB(path);

        readPDF(path);

    }

    //    权限
    private void startRequestPermission() {
        ActivityCompat.requestPermissions(this, permissions, 321);
    }

    public void readPDF(String path) {
        File file = null;
        Bitmap mBitmap= null;
        BitmapDrawable bitmapDrawable;
        //        权限
        int j = ContextCompat.checkSelfPermission(this, permissions[0]);
        if (j != PackageManager.PERMISSION_GRANTED) {
            System.out.println("1110   permission jujue");
            startRequestPermission();
        }

        if (Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) {
            file = new File(path);
            System.out.println(file);
//            file = new File("/storage/emulated/0/PDFDemo_AndroidSRC/test.pdf");
        }

//        打开PDF文件       /storage/emulated/0/PDFDemo_AndroidSRC/test.pdf
//        file = new File("/sdcard/PDFDemo_AndroidSRC/test.pdf");
//        file = new File("/storage/emulated/0/PDFDemo_AndroidSRC/test.pdf");

        if (!file.exists()) {
            return;
        }
        ParcelFileDescriptor pdfFile = null;
//        ContentResolver contentResolver = null;
        try {
//            以只读方式打开
            pdfFile = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
//            pdfFile = (ParcelFileDescriptor) openFileInput(file.getAbsolutePath());
//            pdfFile = contentResolver.openFile(path,);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        System.out.println(110);
        System.out.println(pdfFile);

        PdfRenderer renderer = null;
        try {
//            用上面的pdfFile新建PdfRenderer对象
            renderer = new PdfRenderer(pdfFile);
        } catch (IOException e) {
            e.printStackTrace();
        }

//        获取pdf的页码数
        final int pageCount = renderer.getPageCount();
        System.out.println(120);
//        新建一个bmp数组用于存放pdf页面
        Bitmap[] bitmaps=new Bitmap[pageCount];

//        获取屏幕的高和宽，以决定pdf的高和宽
        WindowManager wm = this.getWindowManager();
        float width = wm.getDefaultDisplay().getWidth();
        float height=wm.getDefaultDisplay().getHeight();
        System.out.println(130);
//        这里用循环把pdf所有的页面都写入bitmap数组，真正使用的时候最好不要这样，因为一本pdf的书会有很多页，一次性全部打开会非常消耗内存，我打开一本两百多页的书就消耗了1.8G的内存，而且打开速度很慢。真正使用的时候要采用动态加载，用户看到哪页才加载附近的几页。而且最好使用多线程在后台打开。
        for (int i = 0; i < pageCount; i++) {
//            根据i的变化打开每一页
            PdfRenderer.Page page = renderer.openPage(i);
            mBitmap=Bitmap.createBitmap((int)(width),(int)(page.getHeight()*width/page.getWidth()),Bitmap.Config.ARGB_8888);//根据屏幕的高宽缩放生成bmp对象
//            将pdf的内容写入bmp中
            page.render(mBitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
//            将pdf的bmp图像存放进数组中
            bitmaps[i]=mBitmap;
//             close the page
            page.close();
        }
        System.out.println(140);
//     close the renderer
        renderer.close();
//        打开pdf结束

//        显示PDF开始
        Canvas canvas = new Canvas();
//        新建一个rv对象指向界面中的rv元素
        RecyclerView recyclerView = findViewById(R.id.pdfview);
//        新建一个线性布局
        LinearLayoutManager linearLayoutManager= new LinearLayoutManager(this);
//        设置我们的rv显示采用线性布局
        recyclerView.setLayoutManager(linearLayoutManager);
//        openPdf方法将pdf文件全部转化为bmp放入数组传给我们之前写好的Adapter
//        PdfViewAdapter pdfViewAdapter=new PdfViewAdapter(openPdf());
        PdfPage.PdfViewAdapter pdfViewAdapter=new PdfPage.PdfViewAdapter(bitmaps);
//        rv设置adapter
        recyclerView.setAdapter(pdfViewAdapter);

    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 321) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
                    //如果没有获取权限，那么可以提示用户去设置界面--->应用权限开启权限
                } else {
                    //获取权限成功提示，可以不要
                    Toast toast = Toast.makeText(this, "获取权限成功", Toast.LENGTH_LONG);
                    toast.setGravity(Gravity.CENTER, 0, 0);
                    toast.show();
                }
            }
        }
    }

    //        pdf的显示页面占位类
    class PdfViewHolder extends RecyclerView.ViewHolder{

        //        用一个imageView来显示pdf
        public ImageView imageView;
        //            此类必须有一个构造方法
        public PdfViewHolder(@NonNull View itemView) {

            super(itemView);
//            imageView对象指向上面image_row_item.xml所写的imageView
            imageView=(ImageView)itemView.findViewById(R.id.imageView);
        }
    }

    class PdfViewAdapter extends RecyclerView.Adapter<PdfPage.PdfViewHolder>{

        //        建一个bmp的数组用来存储已经处理成bmp格式的pdf文件页面
        Bitmap[] bitmaps;

        public PdfViewAdapter(Bitmap[] bmp){
//            构造函数，传入一个bmp的数组，赋值给本类的bmp数组
            bitmaps=bmp;
        }

//        以下三个方法为此类要求必须重写的方法：


        @NotNull
        @Override
//        方法的功能是对要显示的小单元内容进行打包传给小单元占位类
        public PdfViewHolder onCreateViewHolder(@NotNull ViewGroup parent, int viewType) {
//            将小单元实例化成一个可交互的显示小单元
            View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.image_row_item,parent,false);
//            把显示小单元传给小单元占位类
            return new PdfViewHolder(v);
        }


        @Override
//        设置每个小单元显示的内容
        public void onBindViewHolder(@NonNull PdfPage.PdfViewHolder page, int position) {
//            从bmp数组的相应位置获取图片并放入显示小单元相应的image变量中
            page.imageView.setImageBitmap(bitmaps[position]);
        }

        @Override
        public int getItemCount() {
            return bitmaps.length;
        }
    }

    public void insetPathToDB(String path) {

        RecentService recentService = new RecentService(PdfPage.this);
        Boolean sta = recentService.insertRecent(path);

        System.out.println(sta);
    }

}